#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <unistd.h>
#include <signal.h>
#include <setjmp.h>

void pr_mask(char* str) {
	sigset_t sigset;
	int errno_save;

	errno_save = errno;
	if (sigprocmask(0, NULL, &sigset) < 0) {
		printf("sigprocmask error: %s\n", strerror(errno));
		return;
	}

	printf("%s ", str);

	if (sigismember(&sigset, SIGINT)) printf("SIGINT ");
	if (sigismember(&sigset, SIGQUIT)) printf("SIGQUIT ");
	if (sigismember(&sigset, SIGUSR1)) printf("SIGUSR1 ");

	printf("\n");
	errno = errno_save;
}

void sig_int(int signo) {
	pr_mask("\nsig_int: ");
}

int main() {
	sigset_t newmask, oldmask, waitmask;
	pr_mask("start: ");
	if (signal(SIGINT, sig_int) == SIG_ERR) {
		printf("signal error\n");
		return -1;
	}

	sigemptyset(&waitmask);
	sigaddset(&waitmask, SIGUSR1);
	sigaddset(&waitmask, SIGINT);
	sigemptyset(&newmask);
	sigaddset(&newmask, SIGINT);
/*
	if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) {
		printf("sigprocmask error\n");
		return -1;
	}
*/
	pr_mask("critical section: ");

	if (sigsuspend(&waitmask) != -1) {
		printf("sigsuspend error\n");
		return -1;
	}
	pr_mask("after return from sigsuspend: ");
/*
	if (sigprocmask(SIG_UNBLOCK, &oldmask, NULL) < 0) {
		printf("sigprocmask error\n");
		return -1;
	}
*/
	pr_mask("exit: ");

	return 0;
}